class IUP_FLAT_BUTTON
-- Creates an interface element that is a button, but it does not have native 
-- decorations. When selected, this element activates a function in the 
-- application. Its visual presentation can contain a text and/or an image.
--
-- It behaves just like an IUP_BUTTON, but since it is not a native control it 
-- has more flexibility for additional options. It can also behave like an 
-- IUP_TOGGLE (without the checkmark).
--
-- It inherits from IUP_CANVAS. Inherits all callbacks of the IUP_CANVAS, but 
-- redefines a few of them. Including ACTION, BUTTON_CB, FOCUS_CB, 
-- LEAVEWINDOW_CB, and ENTERWINDOW_CB. To allow the application to use those 
-- callbacks the same callbacks are exported with the "FLAT_" prefix using the 
-- same parameters, except the FLAT_ACTION callback that now mimics the 
-- IUP_BUTTON ACTION. They are all called before the internal callbacks and if 
-- they return IUP_IGNORE the internal callbacks are not processed.
	
inherit
	IUP_CANVAS
		redefine
			set_border,
			execute_flat_action,
			execute_flat_button,
			execute_flat_focus,
			execute_flat_enterwindow,
			execute_flat_leavewindow,
			execute_valuechanged
		end
	IUP_WIDGET_FGCOLOR
	IUP_WIDGET_SPACING
	IUP_WIDGET_TITLE
	IUP_WIDGET_IGNORERADIO
	IUP_WIDGET_PADDING
	IUP_WIDGET_BACK_IMAGE_2
	IUP_WIDGET_BORDER
	IUP_WIDGET_FRONT_IMAGE_2
	IUP_WIDGET_IMAGE_2
	IUP_WIDGET_FLAT_TEXT
		redefine
			set_alignment
		end
	IUP_WIDGET_HIGHLIGHT
	IUP_WIDGET_PRESS
	IUP_WIDGET_FOCUSFEEDBACK

create {ANY}
	flat_button

feature {ANY}

	flat_button (title: STRING)
		-- 
		local
			a_flat_button, p: POINTER
		do
			if title /= Void then
				a_flat_button := int_flat_button(title.to_external)
			else
				a_flat_button := int_flat_button(p)
			end

			set_widget(a_flat_button)
		end

	-- Attributes

	set_alignment (horizontal, vertical: STRING)
		-- (non inheritable): horizontal and vertical alignment. Possible values: 
		-- "ALEFT", "ACENTER" and "ARIGHT",  combined to "ATOP", "ACENTER" and 
		-- "ABOTTOM". Default: "ACENTER:ACENTER". 
		do	
			Precursor (horizontal, vertical)
		end

	set_border (state: BOOLEAN)
		-- (creation only): Shows a border around the canvas. Default: "False".
		do
			Precursor (state)
		end

	is_radio: BOOLEAN
		-- returns if the toggle is inside a radio. Valid only after the element 
		-- is mapped and TOGGLE=True.
		local
			str: STRING
		do
			str := iup_open.get_attribute(Current, "RADIO")

			if is_yes_no(str) then
				Result := yesno_to_boolean(str)
			end
		end
	
	set_toggle (state: BOOLEAN)
		-- enabled the toggle behavior. Default: False.
		do
			iup_open.set_attribute(Current, "TOGGLE", boolean_to_yesno(state))
		end

	get_value: STRING
		-- Toggle's state. Values can be "ON", "OFF" or "TOGGLE". 
		do
			Result := iup_open.get_attribute(Current, "VALUE")
		end

	-- Operations

	set_on
		do
			iup_open.set_attribute(Current, "VALUE", "ON")
		end

	set_off
		do
			iup_open.set_attribute(Current, "VALUE", "OFF")
		end

	invert
		-- Invert the current state.
		do
			iup_open.set_attribute(Current, "VALUE", "TOGGLE")
		end

	-- Extra callbacks

	set_cb_flat_action (act: FUNCTION[TUPLE[IUP_FLAT_BUTTON], STRING])
		-- Action generated when the button 1 (usually left) is selected. This 
		-- callback is called only after the mouse is released and when it is 
		-- released inside the button area.
		--
		--	ih: identifier of the element that activated the event.
		--
		-- Returns: IUP_CLOSE will be processed.
		local
			operation: INTEGER
		do
			cb_flat_action := act

			if cb_flat_action /= Void then
				operation := 1
			else
				operation := 0
			end
			
			iup_open.set_callback (Current, "FLAT_ACTION", "Fnff", operation)
		end

	set_cb_flat_button (act: FUNCTION[TUPLE[IUP_FLAT_BUTTON, INTEGER, INTEGER, INTEGER, INTEGER, STRING], STRING])
		-- Action generated when any mouse button is pressed and when it is 
		-- released. Both calls occur before the ACTION callback when button 1 is 
		-- being used.
		-- IUP_CANVAS: identifies the element that activated the event.
		-- button: identifies the activated mouse button:
		--
		-- 1 - left mouse button (button 1);
		-- 2 - middle mouse button (button 2);
		-- 3 - right mouse button (button 3).
		--
		-- pressed: indicates the state of the button:
		--
		-- 0 - mouse button was released;
		-- 1 - mouse button was pressed.
		-- 
		-- x, y: position in the canvas where the event has occurred, in pixels.
		--
		-- status: status of the mouse buttons and some keyboard keys at the 
		-- moment the event is generated. The following macros must be used for 
		-- verification:
		--
		-- Returns: IUP_CLOSE will be processed. On some controls if IUP_IGNORE 
		-- is returned the action is ignored (this is system dependent).
		local
			operation: INTEGER
		do
			cb_flat_button := act

			if cb_flat_button /= Void then
				operation := 1
			else
				operation := 0
			end
			
			iup_open.set_callback (Current, "FLAT_BUTTON_CB", "NONEEDED", operation)
		end

	set_cb_flat_focus (act: FUNCTION[TUPLE[IUP_FLAT_BUTTON, INTEGER], STRING])
		-- Called when the canvas gets or looses the focus. It is called after 
		-- the common callbacks GETFOCUS_CB and KILL_FOCUS_CB.
		-- ih: identifier of the element that activated the event.
		-- focus: is non zero if the canvas is getting the focus, is zero if it 
		-- is loosing the focus.
		local
			operation: INTEGER
		do
			cb_flat_focus := act

			if cb_focus /= Void then
				operation := 1
			else
				operation := 0
			end
			
			iup_open.set_callback (Current, "FLAT_FOCUS_CB", "NONEEDED", operation)
		end

	set_cb_flat_enter_window (act: FUNCTION[TUPLE[IUP_FLAT_BUTTON], STRING])
		-- Action generated when the mouse enters the native element. 
		local
			operation: INTEGER
		do
			cb_flat_enterwindow := act

			if cb_enterwindow /= Void then
				operation := 1
			else
				operation := 0
			end
			
			iup_open.set_callback (Current, "FLAT_ENTERWINDOW_CB", "NONEEDED", operation)
		end

	set_cb_flat_leave_window (act: FUNCTION[TUPLE[IUP_FLAT_BUTTON], STRING])
		-- Action generated when the mouse leaves the native element.
		local
			operation: INTEGER
		do
			cb_flat_leavewindow := act

			if cb_leavewindow /= Void then
				operation := 1
			else
				operation := 0
			end
			
			iup_open.set_callback (Current, "FLAT_LEAVEWINDOW_CB", "NONEEDED", operation)
		end

	set_cb_value_changed (act: FUNCTION[TUPLE[IUP_FLAT_BUTTON], STRING])
		-- Called after the value was interactively changed by the 
		-- user. Called after the ACTION callback, but under the same context. 
		local
			operation: INTEGER
		do
			cb_valuechanged := act

			if cb_valuechanged /= Void then
				operation := 1
			else
				operation := 0
			end
			
			iup_open.set_callback (Current, "VALUECHANGED_CB", "NONEEDED", operation)
		end

feature {IUP}

	-- Callbacks

	execute_flat_action: STRING
		do
			Result := cb_flat_action.item([Current])
		end

	execute_flat_button (btn, pressed, x, y: INTEGER; status: STRING): STRING
		do
			Result := cb_flat_button.item([Current, btn, pressed, x, y, status])
		end

	execute_flat_focus (focus: INTEGER): STRING
		do
			Result := cb_flat_focus.item([Current, focus])
		end

	execute_flat_enterwindow: STRING
		do
			Result := cb_flat_enterwindow.item([Current])
		end

	execute_flat_leavewindow: STRING
		do
			Result := cb_flat_leavewindow.item([Current])
		end

	execute_valuechanged: STRING
		do
			Result := cb_valuechanged.item([Current])
		end

feature {}

	cb_flat_action: FUNCTION[TUPLE[IUP_FLAT_BUTTON], STRING]
	cb_flat_button: FUNCTION[TUPLE[IUP_FLAT_BUTTON, INTEGER, INTEGER, INTEGER, INTEGER, STRING], STRING]
	cb_flat_focus: FUNCTION[TUPLE[IUP_FLAT_BUTTON, INTEGER], STRING]
	cb_flat_enterwindow: FUNCTION[TUPLE[IUP_FLAT_BUTTON], STRING]
	cb_flat_leavewindow: FUNCTION[TUPLE[IUP_FLAT_BUTTON], STRING]
	cb_valuechanged: FUNCTION[TUPLE[IUP_FLAT_BUTTON], STRING]

	-- Internals
	
	int_flat_button (title: POINTER): POINTER
		external "plug_in"
      alias "{
         location: "${sys}/plugins"
         module_name: "iup"
         feature_name: "IupFlatButton"
         }"
      end

end -- class IUP_FLAT_BUTTON

-- The MIT License (MIT)

-- Copyright (c) 2016, 2017, 2018, 2019 by German A. Arias

-- Permission is hereby granted, free of charge, to any person obtaining a copy
-- of this software and associated documentation files (the "Software"), to deal
-- in the Software without restriction, including without limitation the rights
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-- copies of the Software, and to permit persons to whom the Software is
-- furnished to do so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in 
-- all copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-- SOFTWARE.
